package com.diy.sigmund.diycommon.designpatterns.strategy.duck;

import com.diy.sigmund.diycommon.designpatterns.strategy.duck.flybehavior.FlyBehavior;
import com.diy.sigmund.diycommon.designpatterns.strategy.duck.quackbehavior.QuackBehavior;

/**
 * <br>鸭子继承 D u c k，
 * <br>飞行行为实现 F l y B e h a v i o r接口，呱呱叫行为实现 Q u a c k B e h a v i o r接口。
 * <br>也 请 注 意 ， 我 们 描 述 事 情 的 方 式 也 稍 有 改 变 。 不 再 把 鸭 子 的 行 为 说
 * <br>成「一组行为」，我们开始把行为想成是「一族算法」。想想看，在
 * <br>S i m U D u c k 的设计中，算法代表鸭子能做的事（不同的叫法和飞行法），
 * <br>这样的作法也能用于用一群类计算不同州的销售税金。
 * <br>
 * <br>把 每 套 行 为 想象 成 一 个 算 法族
 *
 * @author ylm-sigmund
 * @since 2022/1/13 10:18
 */

public abstract class Duck {

    FlyBehavior flyBehavior;
    QuackBehavior quackBehavior;

    // public Duck() {
    // }

    // 可以「随时」调用这两个方法改变鸭子的行为。
    public void setFlyBehavior(FlyBehavior fb) {
        flyBehavior = fb;
    }

    public void setQuackBehavior(QuackBehavior qb) {
        quackBehavior = qb;
    }

    /** 展示 */
    protected abstract void display();

    protected void swim() {
        System.out.println("All ducks float, even decoys!");
    }

    protected void performFly() {
        flyBehavior.fly();
    }

    protected void performQuack() {
        quackBehavior.quack();
    }

    /**
     * 抽象方法 子类必须都继承；非抽象方法 子类按需覆盖
     */
    protected void a() {
    }
}
